home *** CD-ROM | disk | FTP | other *** search
/ Computer Inter@ctive 16 / Computer Interactive cdrom 16 - dic 98.iso / zdnetit / content / CLASSBLD.ZIP / Include / CB_CriticalMulti.h next >
Encoding:
C/C++ Source or Header  |  1998-03-06  |  8.0 KB  |  234 lines

  1. #ifndef CB_CRITICAL_MULTI_H
  2. #define CB_CRITICAL_MULTI_H
  3.  
  4. #include <assert.h>
  5.  
  6. #include "CB_CriticalSection.h"
  7. #include "CB_Multi.h"
  8.  
  9. #define RELATION_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  10. public:\
  11.     ClassTo* _first##NameTo;\
  12.     ClassTo* _last##NameTo;\
  13.     int _count##NameTo;\
  14. \
  15. public:\
  16.     static CriticalSection _criticalSection##NameTo;\
  17. \
  18.     void Add##NameTo##First(ClassTo* item);\
  19.     void Add##NameTo##Last(ClassTo* item);\
  20.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  21.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  22.     void Remove##NameTo(ClassTo* item);\
  23.     void RemoveAll##NameTo();\
  24.     void DeleteAll##NameTo();\
  25.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  26.     ClassTo* GetFirst##NameTo();\
  27.     ClassTo* GetLast##NameTo();\
  28.     ClassTo* GetNext##NameTo(ClassTo* pos);\
  29.     ClassTo* GetPrev##NameTo(ClassTo* pos);\
  30.     int Get##NameTo##Count();\
  31.     void Move##NameTo##First(ClassTo* item);\
  32.     void Move##NameTo##Last(ClassTo* item);\
  33.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  34.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  35.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  36.     ITERATOR_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  37.  
  38. #define RELATION_NOFILTER_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  39. public:\
  40.     ClassTo* _first##NameTo;\
  41.     ClassTo* _last##NameTo;\
  42.     int _count##NameTo;\
  43. \
  44. public:\
  45.     static CriticalSection _criticalSection##NameTo;\
  46. \
  47.     void Add##NameTo##First(ClassTo* item);\
  48.     void Add##NameTo##Last(ClassTo* item);\
  49.     void Add##NameTo##After(ClassTo* item, ClassTo* pos);\
  50.     void Add##NameTo##Before(ClassTo* item, ClassTo* pos);\
  51.     void Remove##NameTo(ClassTo* item);\
  52.     void RemoveAll##NameTo();\
  53.     void DeleteAll##NameTo();\
  54.     void Replace##NameTo(ClassTo* item, ClassTo* newItem);\
  55.     ClassTo* GetFirst##NameTo();\
  56.     ClassTo* GetLast##NameTo();\
  57.     ClassTo* GetNext##NameTo(ClassTo* pos);\
  58.     ClassTo* GetPrev##NameTo(ClassTo* pos);\
  59.     int Get##NameTo##Count();\
  60.     void Move##NameTo##First(ClassTo* item);\
  61.     void Move##NameTo##Last(ClassTo* item);\
  62.     void Move##NameTo##After(ClassTo* item, ClassTo* pos);\
  63.     void Move##NameTo##Before(ClassTo* item, ClassTo* pos);\
  64.     void Sort##NameTo(int (*comp)(ClassTo*, ClassTo*));\
  65.     ITERATOR_NOFILTER_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  66.  
  67. #define RELATION_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  68. public:\
  69.     ClassFrom* _ref##NameFrom;\
  70.     ClassTo* _prev##NameFrom;\
  71.     ClassTo* _next##NameFrom;\
  72. \
  73. public:\
  74.     ClassFrom* Get##NameFrom() { return _ref##NameFrom; };
  75.  
  76. #define INIT_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  77. {\
  78.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  79.     INIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  80. }
  81.  
  82. #define EXIT_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  83. {\
  84.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  85.     EXIT_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  86. }
  87.  
  88. #define REPLACE_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  89. {\
  90.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  91.     REPLACE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  92. }
  93.  
  94. #define INIT_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  95. {\
  96.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  97.     INIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  98. }
  99.  
  100. #define EXIT_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  101. {\
  102.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  103.     EXIT_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  104. }
  105.  
  106. #define REPLACE_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  107. {\
  108.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  109.     REPLACE_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  110. }
  111.  
  112. #define METHODS_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  113.     CriticalSection ClassFrom##::_criticalSection##NameTo;\
  114. void ClassFrom##::Add##NameTo##First(ClassTo* item)\
  115. {\
  116.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  117.     METHOD_MULTI_ADDFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  118. }\
  119. \
  120. void ClassFrom##::Add##NameTo##Last(ClassTo* item)\
  121. {\
  122.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  123.     METHOD_MULTI_ADDLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  124. }\
  125. \
  126. void ClassFrom##::Add##NameTo##After(ClassTo* item, ClassTo* pos)\
  127. {\
  128.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  129.     METHOD_MULTI_ADDAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  130. }\
  131. \
  132. void ClassFrom##::Add##NameTo##Before(ClassTo* item, ClassTo* pos)\
  133. {\
  134.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  135.     METHOD_MULTI_ADDBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  136. }\
  137. \
  138. void ClassFrom##::Remove##NameTo(ClassTo* item)\
  139. {\
  140.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  141.     METHOD_MULTI_REMOVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  142. }\
  143. \
  144. void ClassFrom##::RemoveAll##NameTo()\
  145. {\
  146.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  147.     METHOD_MULTI_REMOVEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  148. }\
  149. \
  150. void ClassFrom##::DeleteAll##NameTo()\
  151. {\
  152.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  153.     METHOD_MULTI_DELETEALL(ClassFrom, NameFrom, ClassTo, NameTo) \
  154. }\
  155. \
  156. void ClassFrom##::Replace##NameTo(ClassTo* item, ClassTo* newItem)\
  157. {\
  158.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  159.     METHOD_MULTI_REPLACE(ClassFrom, NameFrom, ClassTo, NameTo) \
  160. }\
  161. \
  162. ClassTo* ClassFrom##::GetFirst##NameTo()\
  163. {\
  164.     METHOD_MULTI_GETFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  165. }\
  166. \
  167. ClassTo* ClassFrom##::GetLast##NameTo()\
  168. {\
  169.     METHOD_MULTI_GETLAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  170. }\
  171. \
  172. ClassTo* ClassFrom##::GetNext##NameTo(ClassTo* pos)\
  173. {\
  174.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  175.     METHOD_MULTI_GETNEXT(ClassFrom, NameFrom, ClassTo, NameTo) \
  176. }\
  177. \
  178. ClassTo* ClassFrom##::GetPrev##NameTo(ClassTo* pos)\
  179. {\
  180.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  181.     METHOD_MULTI_GETPREV(ClassFrom, NameFrom, ClassTo, NameTo) \
  182. }\
  183. \
  184. int ClassFrom##::Get##NameTo##Count()\
  185. {\
  186.     METHOD_MULTI_GETCOUNT(ClassFrom, NameFrom, ClassTo, NameTo) \
  187. }\
  188. \
  189. void ClassFrom##::Move##NameTo##First(ClassTo* item)\
  190. {\
  191.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  192.     METHOD_MULTI_MOVEFIRST(ClassFrom, NameFrom, ClassTo, NameTo) \
  193. }\
  194. \
  195. void ClassFrom##::Move##NameTo##Last(ClassTo* item)\
  196. {\
  197.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  198.     METHOD_MULTI_MOVELAST(ClassFrom, NameFrom, ClassTo, NameTo) \
  199. }\
  200. \
  201. void ClassFrom##::Move##NameTo##After(ClassTo* item, ClassTo* pos)\
  202. {\
  203.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  204.     METHOD_MULTI_MOVEAFTER(ClassFrom, NameFrom, ClassTo, NameTo) \
  205. }\
  206. \
  207. void ClassFrom##::Move##NameTo##Before(ClassTo* item, ClassTo* pos)\
  208. {\
  209.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  210.     METHOD_MULTI_MOVEBEFORE(ClassFrom, NameFrom, ClassTo, NameTo) \
  211. }\
  212. \
  213. void ClassFrom##::Sort##NameTo##(int (*comp)(ClassTo*, ClassTo*))\
  214. {\
  215.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  216.     METHOD_MULTI_SORT(ClassFrom, NameFrom, ClassTo, NameTo) \
  217. }
  218.  
  219. #define METHODS_CRITICAL_MULTI_PASSIVE(ClassFrom, NameFrom, ClassTo, NameTo)
  220.  
  221. #define WRITE_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  222. {\
  223.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  224.     WRITE_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  225. }
  226.  
  227. #define READ_CRITICAL_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  228. {\
  229.     CriticalSectionLock lock(ClassFrom::_criticalSection##NameTo);\
  230.     READ_MULTI_ACTIVE(ClassFrom, NameFrom, ClassTo, NameTo) \
  231. }
  232.  
  233. #endif
  234.